package org.triumphxx.random;

/**
 * @author:triumphxx
 * @Date:2023/10/22
 * @Time:11:22
 * @微信公众号：思考集结处
 * @网站：https://blog.triumphxx.com.cn
 * @GitHub https://github.com/triumphxx
 * @Desc: 随机函数
 **/
public class RandomFun {

    /**
     * java 中的Math.random随机函数
     * 等概率返回 [0-1) 之间的数据
     * 可扩展为 [0-N)之间的数据
     */
    public static void mathRandom() {
        double randomNum = Math.random();
        System.out.println(randomNum);
    }

    /**
     * 打印命中概率
     *
     * @param testTimes 测试次数
     * @param count     命中次数
     */
    public static void printChance(int testTimes, int count) {
        System.out.println("概率为：" + ((double) count / (double) testTimes));
    }

    /**
     * 等概率产生1-5之间的数字
     *
     * @return
     */
    public static int print15() {
        return (int) (Math.random() * 5) + 1;
    }

    /**
     * 等概率得到0和1
     *
     * @return
     */
    public static int printZeroAndOne() {
        int ans = 0;
        do {
            ans = print15();
        } while (ans == 3);

        return ans < 3 ? 0 : 1;
    }

    /**
     * 使用二进制等概率返回 0~6
     * 使用左移拼接的方式
     *
     * @return
     */
    public static int print06() {
        int ans = 0;
        do {
            ans = (printZeroAndOne() << 2) + (printZeroAndOne() << 1) + printZeroAndOne();
        } while (ans == 7);
        return ans;
    }

    /**
     * 等概率返回1~7
     *
     * @return
     */
    public static int print17() {
        return print06() + 1;
    }

    /**
     * 产生 0 1 不等概率出现
     *
     * @return
     */
    public static int print01NotChance() {
        return Math.random() < 0.76 ? 0 : 1;
    }

    /**
     * 产生 0 1 等概率
     * @return
     */
    public static int print01Chance(){
        int  ans = 0 ;
        do {
            ans = print01NotChance();
        }while (ans == print01NotChance());
        return ans;
    }
    public static void main(String[] args) {

        //测试次数
        int testTimes = 10000000;
        //命中次数
        int count = 0;

        int K = 9;
        // [0,K) -> [0,8]
        int[] counts = new int[9];
        for (int i = 0; i < testTimes; i++) {
            int ans = (int) (Math.random() * K); // [0,K-1]
            counts[ans]++;
        }
        for (int i = 0; i < K; i++) {
            System.out.println(i + "这个数，出现了 " + counts[i] + " 次");
        }

        for (int i = 0; i < testTimes; i++) {
            if (Math.random() * 5 < 4.5) {
                count++;
            }
        }
        printChance(testTimes, count);

        System.out.println(print17());
    }
}
